package br.com.websec.web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.websec.cliente.Cliente;
import br.com.websec.cliente.ClienteRN;
import br.com.websec.endereco.Endereco;
import br.com.websec.endereco.EnderecoRN;
import br.com.websec.fornecedor.Fornecedor;
import br.com.websec.fornecedor.FornecedorRN;
import br.com.websec.usuario.Usuario;
import br.com.websec.util.ContextoUtil;
import br.com.websec.util.CpfCnpjUtil;

@ManagedBean(name = "clienteBean")
@ViewScoped
public class ClienteBean implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 7890196321591976248L;
	private Cliente cliente = new Cliente();
	private Endereco endereco = new Endereco();
	private String numero;
	private String tipoPessoa ;
	private boolean pessoaFisica = false;
	private boolean pessoaJuridica = false;

	public Usuario getUsuarioLogado(){
		ContextoBean contexto = ContextoUtil.getContextoBean();
		Usuario u = contexto.getUsuarioLogado();
		return u;
	}
	public String salvar() {

		
		FacesContext context = FacesContext.getCurrentInstance();

		if (this.tipoPessoa == null) {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"Tipo pessoa inválido",
					"Selecione um tipo de pessoa para efetuar o cadastro.");
			context.addMessage(null, msg);
			return null;
		}

		if (validaPessoaFisica()) {
			if (validaCPF(this.cliente.getCnpj())) {
				CpfCnpjUtil validaCpf = new CpfCnpjUtil();
				atribuirEnderecoCliente();
				cliente.setCnpj(validaCpf.noFormatCNPJ(cliente.getCnpj()));

			} else {
				FacesMessage msg = new FacesMessage(
						FacesMessage.SEVERITY_ERROR, "CPF Inválido",
						"informe um CPF válido.");
				context.addMessage(null, msg);
				setPessoaFisica(true);
				return null;

			}

		}
		if (validaPessoaJuridica()) {

			if (validaCNPJ(this.cliente.getCnpj())) {
				CpfCnpjUtil validaCpf = new CpfCnpjUtil();
				atribuirEnderecoCliente();
				cliente.setCnpj(validaCpf.noFormatCNPJ(cliente.getCnpj()));
				atribuirEnderecoCliente();
				//return "clienteSucesso";

			} else {
				FacesMessage msg = new FacesMessage(
						FacesMessage.SEVERITY_ERROR, "CNPJ Inválido",
						"Informe um CNPJ válido.");
				context.addMessage(null, msg);
				setPessoaJuridica(true);
				return null;

			}
		}
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cliente cadastrado com Sucesso!", null));
//		FacesMessage msg = new FacesMessage(FacesMessage.FACES_MESSAGES, "Cliente cadastrado com sucesso");
//		context.addMessage(null, msg);

		return "cadastro";

	}

	public void atribuirEnderecoCliente() {
		ClienteRN clienteRN = new ClienteRN();
		EnderecoRN enderecoRN = new EnderecoRN();
		this.endereco.setNumero(Integer.parseInt(this.numero));
		this.endereco.setCliente(this.cliente);
		List<Fornecedor> lista = new ArrayList<Fornecedor>();
		lista.add(buscarFornecedor());
		cliente.setFornecedores(lista);
		clienteRN.salvarCliente(cliente);
		enderecoRN.salvarEndereco(this.endereco);
	}

	public void cancelar() {
		this.cliente = null;
		this.endereco = null;
		this.tipoPessoa = null;
		this.pessoaFisica = false;
		this.pessoaJuridica = false;

	}
	
	public Usuario usuarioLogado(){
		
		ContextoBean ctx = ContextoUtil.getContextoBean();
		Usuario usr = new Usuario();
		usr = ctx.getUsuarioLogado();
		return usr;
	}

	public void selecionaTipoPessoa() {

		if (this.tipoPessoa.equals("0")) {
			this.pessoaFisica = true;
			this.pessoaJuridica = false;
		} else if (this.tipoPessoa.equals("1")) {
			this.pessoaJuridica = true;
			this.pessoaFisica = false;
		}

	}
	
	
	public Fornecedor buscarFornecedor(){
		Fornecedor f = new Fornecedor();
		FornecedorRN fRN = new FornecedorRN();
		Usuario us = usuarioLogado();
		f= fRN.buscarPorEmail(us.getEmail());
		return f;
	}

	public boolean validaCPF(String cpf) {
		CpfCnpjUtil validaCpf = new CpfCnpjUtil();
		
		String novoCPF = validaCpf.noFormatCPF(cpf);
		if (validaCpf.isValidCPF(novoCPF)) {
			return true;

		}
		return false;
	}

	public boolean validaCNPJ(String cnpj) {
		CpfCnpjUtil validaCnpj = new CpfCnpjUtil();
		
		String novoCnpj = validaCnpj.noFormatCNPJ(cnpj);
		if (validaCnpj.isValidCNPJ(novoCnpj)) {
			return true;

		}
		return false;
	}

	public boolean validaPessoaJuridica() {
		if (this.tipoPessoa.equals("1")) {
			return true;

		}
		return false;
	}

	public boolean validaPessoaFisica() {
		if (this.tipoPessoa.equals("0")) {
			return true;

		}
		return false;
	}

	public Cliente getCliente() {
		return this.cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Endereco getEndereco() {
		return this.endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public String getTipoPessoa() {
		return this.tipoPessoa;
	}

	public void setTipoPessoa(String tipoPessoa) {
		this.tipoPessoa = tipoPessoa;
	}

	public boolean isPessoaFisica() {
		return this.pessoaFisica;
	}

	public void setPessoaFisica(boolean pessoaFisica) {
		this.pessoaFisica = pessoaFisica;
	}

	public boolean isPessoaJuridica() {
		return this.pessoaJuridica;
	}

	public void setPessoaJuridica(boolean pessoaJuridica) {
		this.pessoaJuridica = pessoaJuridica;
	}

	public String getNumero() {
		return this.numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}
	
}
